uint32_t descriptor_pool_maxsets;
VkDescriptorSet *descriptor_sets;
gsize n_descriptor_sets;
- GskVulkanPipeline *pipeline;
+ GskVulkanPipeline *pipelines[GSK_VULKAN_N_PIPELINES];
VkCommandBuffer command_buffer;
self->layout = gsk_vulkan_pipeline_layout_new (self->vulkan);
- self->pipeline = gsk_vulkan_pipeline_new (self->layout, "blit", self->render_pass);
-
return self;
}
return buffer;
}
+GskVulkanPipeline *
+gsk_vulkan_render_get_pipeline (GskVulkanRender *self,
+ GskVulkanPipelineType type)
+{
+ static const struct {
+ const char *name;
+ } pipeline_info[GSK_VULKAN_N_PIPELINES] = {
+ { "blit" },
+ { "color" }
+ };
+
+ g_return_val_if_fail (type < GSK_VULKAN_N_PIPELINES, NULL);
+
+ if (self->pipelines[type] == NULL)
+ {
+ self->pipelines[type] = gsk_vulkan_pipeline_new (self->layout,
+ pipeline_info[type].name,
+ self->render_pass);
+ }
+
+ return self->pipelines[type];
+}
+
VkDescriptorSet
gsk_vulkan_render_get_descriptor_set (GskVulkanRender *self,
gsize id)
},
VK_SUBPASS_CONTENTS_INLINE);
- vkCmdBindPipeline (self->command_buffer,
- VK_PIPELINE_BIND_POINT_GRAPHICS,
- gsk_vulkan_pipeline_get_pipeline (self->pipeline));
-
vkCmdBindVertexBuffers (self->command_buffer,
0,
1,
GHashTableIter iter;
gpointer key, value;
VkDevice device;
+ guint i;
gsk_vulkan_render_cleanup (self);
}
g_hash_table_unref (self->framebuffers);
- g_clear_object (&self->pipeline);
+ for (i = 0; i < GSK_VULKAN_N_PIPELINES; i++)
+ g_clear_object (&self->pipelines[i]);
g_clear_pointer (&self->layout, gsk_vulkan_pipeline_layout_unref);
GSK_VULKAN_OP_FALLBACK,
GSK_VULKAN_OP_SURFACE,
GSK_VULKAN_OP_TEXTURE,
+ GSK_VULKAN_OP_COLOR,
/* GskVulkanOpPushConstants */
GSK_VULKAN_OP_PUSH_VERTEX_CONSTANTS,
GSK_VULKAN_OP_PUSH_FRAGMENT_CONSTANTS
{
GskVulkanOpType type;
GskRenderNode *node; /* node that's the source of this op */
+ GskVulkanPipeline *pipeline; /* pipeline to use */
GskVulkanImage *source; /* source image to render */
gsize vertex_offset; /* offset into vertex buffer */
gsize vertex_count; /* number of vertices */
default:
op.type = GSK_VULKAN_OP_FALLBACK;
+ op.render.pipeline = gsk_vulkan_render_get_pipeline (render, GSK_VULKAN_PIPELINE_BLIT);
g_array_append_val (self->render_ops, op);
break;
case GSK_CAIRO_NODE:
op.type = GSK_VULKAN_OP_SURFACE;
+ op.render.pipeline = gsk_vulkan_render_get_pipeline (render, GSK_VULKAN_PIPELINE_BLIT);
g_array_append_val (self->render_ops, op);
break;
case GSK_TEXTURE_NODE:
op.type = GSK_VULKAN_OP_TEXTURE;
+ op.render.pipeline = gsk_vulkan_render_get_pipeline (render, GSK_VULKAN_PIPELINE_BLIT);
+ g_array_append_val (self->render_ops, op);
+ break;
+
+ case GSK_COLOR_NODE:
+ op.type = GSK_VULKAN_OP_PUSH_FRAGMENT_CONSTANTS;
+ gsk_vulkan_push_constants_init_copy (&op.constants.constants, constants);
+ gsk_vulkan_push_constants_set_color (&op.constants.constants, gsk_color_node_peek_color (node));
+ g_array_append_val (self->render_ops, op);
+
+ op.type = GSK_VULKAN_OP_COLOR;
+ op.render.pipeline = gsk_vulkan_render_get_pipeline (render, GSK_VULKAN_PIPELINE_COLOR);
g_array_append_val (self->render_ops, op);
break;
gsk_vulkan_push_constants_init_copy (&op.constants.constants, constants);
gsk_vulkan_push_constants_multiply_mvp (&op.constants.constants, &transform);
g_array_append_val (self->render_ops, op);
+
gsk_vulkan_render_pass_add_node (self, render, &op.constants.constants, gsk_transform_node_get_child (node));
gsk_vulkan_push_constants_init_copy (&op.constants.constants, constants);
g_array_append_val (self->render_ops, op);
default:
g_assert_not_reached ();
+ case GSK_VULKAN_OP_COLOR:
case GSK_VULKAN_OP_PUSH_VERTEX_CONSTANTS:
case GSK_VULKAN_OP_PUSH_FRAGMENT_CONSTANTS:
break;
case GSK_VULKAN_OP_FALLBACK:
case GSK_VULKAN_OP_SURFACE:
case GSK_VULKAN_OP_TEXTURE:
+ case GSK_VULKAN_OP_COLOR:
op->render.vertex_offset = offset + n;
op->render.vertex_count = gsk_vulkan_render_op_collect_vertices (&op->render, vertices + n + offset);
break;
default:
g_assert_not_reached ();
+ case GSK_VULKAN_OP_COLOR:
case GSK_VULKAN_OP_PUSH_VERTEX_CONSTANTS:
case GSK_VULKAN_OP_PUSH_FRAGMENT_CONSTANTS:
break;
GskVulkanPipelineLayout *layout,
VkCommandBuffer command_buffer)
{
+ GskVulkanPipeline *current_pipeline = NULL;
GskVulkanOp *op;
guint i;
},
0,
NULL);
+ /* fall through */
+ case GSK_VULKAN_OP_COLOR:
+ if (current_pipeline != op->render.pipeline)
+ {
+ current_pipeline = op->render.pipeline;
+ vkCmdBindPipeline (command_buffer,
+ VK_PIPELINE_BIND_POINT_GRAPHICS,
+ gsk_vulkan_pipeline_get_pipeline (current_pipeline));
+ }
vkCmdDraw (command_buffer,
op->render.vertex_count, 1,